package com.ssy.lingxi.order.service.feign;

import com.ssy.lingxi.common.model.dto.MemberAndRoleIdDTO;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.member.merchant.api.model.constant.MemberRightSpendTypeEnum;
import com.ssy.lingxi.member.merchant.api.model.vo.inner.request.MemberFeignRelationVO;
import com.ssy.lingxi.member.merchant.api.model.vo.inner.request.MemberFeignVO;
import com.ssy.lingxi.member.merchant.api.model.vo.inner.response.MemberFeignRelationRightDetailVO;
import com.ssy.lingxi.member.merchant.api.model.vo.inner.response.MemberFeignRightByOrderVO;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.model.bo.VendorBO;
import com.ssy.lingxi.order.model.dto.*;
import com.ssy.lingxi.order.model.vo.basic.request.OrderDeductionVO;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;

/**
 * 会员服务Feign接口调用
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-23
 */
@Service
public interface IMemberFeignService {

    /**
     * （异步）通知会员服务，计算等级、权益、积分
     * @param buyerMemberId 采购商会员Id
     * @param buyerRoleId   采购商会员角色Id
     * @param vendorMemberId 供应商会员Id
     * @param vendorRoleId   供应商会员角色Id
     * @param amount         订单金额
     * @param orderNo        订单号
     */
    void calculateMemberLrcAsync(Long buyerMemberId, Long buyerRoleId, Long vendorMemberId, Long vendorRoleId, BigDecimal amount, String orderNo);

    /**
     * 通知会员服务，计算等级、权益、积分
     * @param buyerMemberId 采购商会员Id
     * @param buyerRoleId   采购商会员角色Id
     * @param vendorMemberId 供应商会员Id
     * @param vendorRoleId   供应商会员角色Id
     * @param amount         订单金额
     * @param orderNo        订单号
     * @return 订单返现金额
     */
    Wrapper<BigDecimal> calculateMemberLrc(Long buyerMemberId, Long buyerRoleId, Long vendorMemberId, Long vendorRoleId, BigDecimal amount, String orderNo);

    /**
     * 积分支付订单，校验可用信用积分、支付密码
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId   供应会员角色Id
     * @param fundMode 资金归集模式，1-平台代收，2-会员直接到账
     * @param payPassword    前端传递的Aes加密后的支付密码
     * @param memberRightSpendTypeEnum 积分消费类型枚举
     * @param payAmount 使用的积分
     * @param orderNo 订单号
     * @return 校验结果
     */
    Wrapper<Void> calculateMemberUsedRightPoint(Long buyerMemberId, Long buyerRoleId, Long vendorMemberId, Long vendorRoleId, Integer fundMode, String payPassword, MemberRightSpendTypeEnum memberRightSpendTypeEnum, BigDecimal payAmount, String orderNo);

    /**
     * 批量查询会员价格权益（会员折扣）
     * @param vendorRelations 会员关系列表
     * @return 查询结果
     */
    Wrapper<List<MemberFeignRelationRightDetailVO>> batchFindMemberPriceRight(List<MemberFeignRelationVO> vendorRelations);

    /**
     * 订单完成后，向会员服务的订单评论功能发送订单数据
     * @param order 订单
     */
    void saveMemberOrderCommentAsync(OrderDO order);

    /**
     * 查询平台会员的信息
     * @param name 会员名称
     * @param members 会员Id和角色Id列表
     * @return 查询结果
     */
    Wrapper<List<OrderMemberQueryDTO>> findPlatformMembers(String name, List<MemberFeignVO> members);

    /**
     * 批量查询会员Logo
     * @param memberIds 会员Id列表
     * @return 会员logo列表
     */
    Wrapper<List<MemberLogoDTO>> findMemberLogos(List<Long> memberIds);

    /**
     * 查询会员Logo
     * @param memberId 会员Id
     * @return 会员logo
     */
    Wrapper<MemberLogoDTO> findMemberLogo(Long memberId);

    /**
     * 平台后台-商户支付策略配置，查询角色类型为服务提供者的平台商户会员列表
     * @param name    会员名称
     * @param members 会员Id和角色Id列表
     * @return 查询结果
     */
    Wrapper<List<OrderMemberQueryDTO>> listPlatformMembers(String name, List<MemberDTO> members);

    /**
     * SRM订单 - 查询会员入库分类 - 主营品类及结算方式信息
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId   供应会员角色Id
     * @return 查询结果
     */
    List<MemberCategoryDTO> findMemberBusinessCategories(Long buyerMemberId, Long buyerRoleId, Long vendorMemberId, Long vendorRoleId);

    /**
     * 查询供应商业务员用户Id
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId   供应会员角色Id
     * @return 查询结果
     */
    Wrapper<Long> findVendorSalesUserId(Long buyerMemberId, Long buyerRoleId, Long vendorMemberId, Long vendorRoleId);

    /**
     * 批量查询供应商业务员用户Id
     * @param buyerMemberId 采购会员id
     * @param buyerRoleId 采购会员角色Id
     * @param vendors 供应商列表
     * @return 查询结果
     */
    Wrapper<List<OrderSalesDTO>> findVendorSales(Long buyerMemberId, Long buyerRoleId, List<VendorBO> vendors);

    /**
     * 批量查询供应商业务员用户Id
     * @param members 采购会员与供应会员列表
     * @return 查询结果
     */
    Wrapper<List<OrderSalesDTO>> findVendorSales(List<OrderMemberDTO> members);

    /**
     * 查询用户信息
     * @param userId 用户Id
     * @return 用户信息
     */
    MemberUserDTO findUserDetail(Long userId);

    /**
     * 批量查询采购会员的平台积分与供应商店铺积分
     * @param buyerMemberId 采购商会员id
     * @param buyerRoleId 采购商角色
     * @param upperMemberList 供应商会员信息list
     * @return
     */
    Wrapper<List<MemberFeignRightByOrderVO>> batchMemberPriceRightForOrder(Long buyerMemberId, Long buyerRoleId, List<MemberAndRoleIdDTO> upperMemberList);

    /**
     * 扣减会员积分或平台积分
     * @param deductions 积分抵扣列表
     * @param order      订单
     * @return 操作结果
     */
    Wrapper<Void> memberDeductionPoints(OrderDO order, List<OrderDeductionVO> deductions, BigDecimal usePoints);

    /**
     * 订单取消后，返还已抵扣的积分
     * @param order 订单
     * @return 操作结果
     */
    Wrapper<Void> returnDeductionPoints(OrderDO order);
}
